<?php
/**
 * Created by PhpStorm.
 * User: s.utkin
 * Date: 12.08.14
 * Time: 18:22
 */

namespace Messenger\Messages\Send;


use Messenger\Queue;
use Messenger\Groups;
use Messenger\Relations;
use Messenger\Messages;
use Messenger\BaseAction;
use Messenger\Unseen;
use Users\Profile;
use FlashMessages\FlashMessage;

class FormAction extends BaseAction
{
	protected static $isPublic = true;
	
	function privileges() {
		return '#authorized';
	}
	
	static function pullParams() {
		return ['identity', 'isPost', 'isAjax'];
	}
	
    /**
     * Выводит форму отправки сообщения и добавляет отправленные сообщения в БД.
     */
    protected function run()
    {
    	// отрубаем кеширование если пост-запрос
    	if ($this->request->_isPost) {
    		$this->response->noCache(true);
    	}

        # Собираем форму
        $formId = 'Messages' . '_' .  $this->request->companionProfileId;

        $formConfig = FormConfig::get();
        $formConfig['htmlOptions']['action'] = $this->url('.form',
			[
				'myProfileId' => $this->request->myProfileId,
				'companionProfileId' => $this->request->companionProfileId,
			]
		);
        $formConfig['htmlOptions']['groupId'] = $this->request->groupId;
        $formConfig['htmlOptions']['myProfileId'] = $this->request->myProfileId;
        $formConfig['htmlOptions']['companionProfileId'] = $this->request->companionProfileId;
        $form = new \Pinenut\Form($this->request->myProfileId, $formId, $formConfig);

        if ($this->request->_isPost && $this->request->_isAjax) {
			if ($this->request->isPartial) {
				$this->response->noRender(true);
				$form->process($this->request->params(), true);

				return;
			}

            # Валидируем форму
            if ($form->process($this->request->params())) {
				/** @var Profile $companionProfile */
				$companionProfile = Profile::find($this->request->companionProfileId);

				if ($companionProfile->serviceType > 0) {
					return;
				}

                $messageData = $form->getValues();
                $myProfileId = $this->request->myProfileId;

                # Получаем экземпляр группы, в которую отправлено сообщение
                $groupId = (string)$this->request->groupId;
                /** @var Groups $groupModel */
                $groupModel = Groups::find($groupId);

                if (!$groupModel) {
                    throw new \Exception('$groupModel пуста.', 500);
                }

                # Сохраняем сообщение
                $message = new Messages();
                $message->group[$groupModel];
                $message->text = $messageData['text'];
                $message->author[$myProfileId];
                $message->save();

				$isFirstGroupMessage = (int)($groupModel->lastMessageTime == 0);

				/*
				 * У всех пользователей группы, которые не являются автором сообщения
				 * увеличиваем счетчик первых входящих сообщений в новой группе (для replyRate)
				 */
				
				if (!$groupModel->lastNonServiceMessageTime) {

					$groupModel->addProfileToAuthorsOrderedPool($myProfileId);

					foreach ($groupModel->relations as $relation) {
						if ($relation->_ref != (string)$myProfileId) {
							/** @var \Users\Profile $companionProfile */
							$companionProfile = Profile::find($relation->_ref);
							$companionProfile->replyRateIn++;
							$companionProfile->save();
						}
					}
				}
				elseif (!in_array($myProfileId, $groupModel->authorsOrderedPool)) {
					$groupModel->addProfileToAuthorsOrderedPool($myProfileId);
					/** @var \Users\Profile $myProfile */
					$myProfile = Profile::find($myProfileId);

					$myProfile->replyRateOut++;
					$myProfile->save();
				}

                /** @var $relation Relations */
                foreach ($groupModel->relations as $relation) {
                    if ($relation->_ref != (string)$myProfileId) {
						# Меняем отношение получателей к группе на "Нейтральное", если было "Не известное"
						if ($relation->status == Relations::STATUS_UNKNOWN) {
							$relation->status = Relations::STATUS_NEUTRAL;
						}

						# Увеличиваем счетчик непрочитанных сообщений в группе у всех, кроме себя
						$groupModel->unseenMessages[$relation->_ref]->count++;
                    }else{
                    	//Пока так
                    	if ($relation->status == Relations::STATUS_UNKNOWN) {
                    		$relation->status = Relations::STATUS_NEUTRAL;
                    	}
                    }
                }

				$groupModel->lastNonServiceMessageTime = intval(microtime(true) * 10000.0);
                $groupModel->save();

				$notificationData = [
					'groupId' => (string)$groupModel,
					'messageId' => (string)$message,
					'authorId' => (string)$message->author,
				];

				if ($isFirstGroupMessage) {
					$notificationData['isFirstGroupMessage'] = 1;
				}

                Queue::enqueue(
                    [
                        'type' => \MessengerNotificationDeliveryConfig::TYPE_NEW_MESSAGE,
                        'data' => $notificationData,
                    ]
                );

                FlashMessage::sendMessage($this->request->companionProfileId, 
                	'flashMessages.contentActions.userMessage', 
                	['content' => 'User has sent message for you.'], 
                	false, false, false);

                # Очищаем форму
                $form->flush(true);

                $this->response->noRender(true);
                $this->response->content = (string)$message;
					/*$this->action('messenger.messages.item', [
                        'messageId' => $message->_id,
                        'messageIsMine' => $message->author == $myProfileId,
                    ]);*/
                return;
            }
        }

        $this->response->form = $form;
    }
}